package org.boot.fast.util;

import com.fasterxml.jackson.databind.ObjectMapper;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
 * 对象工具类，提供对象相关的静态方法
 * @author: 最爱芫荽
 * @email: 15733440205@163.com
 */
public class ObjectUtil {

    /**
     * 通用属性值获取方法
     * @param target 目标对象
     * @param fieldName 属性名
     * @return 属性值
     * @throws IllegalArgumentException 当属性不存在或访问失败时抛出
     */
    @SuppressWarnings("unchecked")
    public static <T> T getValue(Object target, String fieldName) {
        try {
            // 1. 获取目标对象的Class对象
            Class<?> clazz = target.getClass();
            // 2. 获取指定字段（包含私有字段）
            Field field = clazz.getDeclaredField(fieldName);
            // 3. 设置可访问性（突破private限制）
            field.setAccessible(true);
            // 4. 获取字段值并进行类型转换
            return (T) field.get(target);
        } catch (NoSuchFieldException e) {
            throw new IllegalArgumentException("属性不存在: " + fieldName + " in " + target.getClass().getName(),  e);
        } catch (IllegalAccessException e) {
            throw new IllegalArgumentException("无法访问属性: " + fieldName, e);
        }
    }

    /**
     * 判断对象是否为空
     *
     * @param obj 对象
     * @return 如果对象为null，则返回true，否则返回false
     */
    public static boolean isEmpty(Object obj) {
        return obj == null;
    }

    /**
     * 判断对象是否不为空
     *
     * @param obj 对象
     * @return 如果对象不为null，则返回true，否则返回false
     */
    public static boolean isNotEmpty(Object obj) {
        return !isEmpty(obj);
    }

    /**
     * 判断两个对象是否相等
     * 使用Objects.equals方法，可以安全地处理null值
     *
     * @param obj1 第一个对象
     * @param obj2 第二个对象
     * @return 如果两个对象相等（包括都为null），则返回true，否则返回false
     */
    public static boolean equals(Object obj1, Object obj2) {
        return Objects.equals(obj1, obj2);
    }

    /**
     * 克隆对象
     * 使用对象的clone方法，要求对象实现Cloneable接口
     *
     * @param obj 对象
     * @param <T> 对象类型
     * @return 克隆后的对象
     * @throws CloneNotSupportedException 如果对象未实现Cloneable接口
     */
    @SuppressWarnings("unchecked")
    public static <T extends Cloneable> T clone(T obj) {
        if (obj == null) {
            return null;
        }
        try{
            return (T) obj.getClass().getMethod("clone").invoke(obj);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 安全地获取对象的toString方法
     * 如果对象为null，则返回"null"字符串
     *
     * @param obj 对象
     * @return 对象的字符串表示
     */
    public static String toString(Object obj) {

        return obj == null ? "null" : obj.toString();
    }




}
